According to the Java Comparable.compareTo(T o)
documentation:
It is strongly recommended, but not strictly required that (x.compareTo(y)==0) == (x.equals(y))
.
Generally speaking, any class that implements the Comparable interface and violates this condition should clearly indicate this fact.
The recommended language is "Note: this class has a natural ordering that is inconsistent with equals."
If this rule is violated, weird and unpredictable failures can occur.
For example, in Java 5 the PriorityQueue.remove()
method relied on compareTo()
, but since Java 6 it has relied on
equals()
.
Noncompliant code example
public class Foo implements Comparable<Foo> {
@Override
public int compareTo(Foo foo) { /* ... */ } // Noncompliant as the equals(Object obj) method is not overridden
}
Compliant solution
public class Foo implements Comparable<Foo> {
@Override
public int compareTo(Foo foo) { /* ... */ } // Compliant
@Override
public boolean equals(Object obj) { /* ... */ }
}